package com.example.nettydemo.demos.BIO;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


/**
 * 使用telnet 127.0.0.1 6666   连接服务器，向服务器发送信息
 *
 * 弊端：
 * 1、一个客户端一个线程
 * 2、当并发数比较大的时候，需要创建大量线程来处理链接，系统占用资源较大
 * 3、链接建立之后，如果当前线程暂时没有数据可读，则线程就阻塞Read操作上，造成线程资源浪费；
 * */

public class BioServer {

    public static void main(String[] args) throws Exception {

        //创建线程池

        ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();

        //创建serverSocket
        ServerSocket serverSocket = new ServerSocket(6666);

        System.out.println("服务器启动了");

        while (true) {

            System.out.println("等待连接。。");

            final Socket socket = serverSocket.accept();

            System.out.println("连接到一个客户端");

            newCachedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    handler(socket);
                }
            });

        }


    }

    /**
     * 编写方法与客户端通讯
     */
    public static void handler(Socket socket) {
        byte[] bytes = new byte[1024];

        try {


            InputStream inputStream = socket.getInputStream();
            //循环读取输入流数据

            while (true) {
                System.out.println("等待读取数据。。。");
                int len = inputStream.read(bytes);

                if (len == -1) {
                    break;
                }
                System.out.println("当前客户端，线程ID: " + Thread.currentThread().getId() + "，线程名字: " + Thread.currentThread().getName() + ", 发送内容： " +new String(bytes, 0, len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                System.out.println("连接关闭");
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
